﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using WebRamosUC.Models;

namespace WebRamosUC.Controllers
{
    public class SeccionController : Controller
    {
        RepositorioCurso repocurso = new RepositorioCurso();
        RepositorioUsuario repousuario = new RepositorioUsuario();
        RepositorioRecomendacion reporecom = new RepositorioRecomendacion();


        //
        // GET: /Seccion/Details/IIC2122/2

        public ActionResult Details(string sigla_sec)
        {
            string[] sigla = sigla_sec.Split('/');

            Curso curso = repocurso.GetCurso(sigla[0]);
            Seccion seccion = repocurso.GetSeccion(sigla[0], Convert.ToInt32(sigla[1]));


            if (curso == null || seccion == null)
                return View("..\\Curso\\NotFound");

            else
            {
                // esto es como para TODAS las recomendaciones de un curso, no de una seccion
                if (Request != null && Request.IsAuthenticated)
                {
                    ViewData["AlreadyRecomended"] = repocurso.UserHasAlreadyPost(seccion.IDSeccion, this.User.Identity.Name);
                    ViewData["AlreadyReported"] = reporecom.UserHasReported(seccion, this.User.Identity.Name);
                    ViewData["AlreadySuscribed"] = repousuario.UserHasSuscribed(seccion, this.User.Identity.Name);
                }
                else
                {
                    ViewData["AlreadySuscribed"] = false;
                }

                return View(seccion);
            }
        }

        public ActionResult CalificarPositivo()
        {
            return View("..\\Curso\\NotFound");
        }
        

        //
        // AJAX Calificar Positivo
        [Authorize, HttpGet]
        public ActionResult CalificarPositivo(int id)
        {
            String res = Calificar(id, true);
            if (res == "NotFound")
                return View("..\\Curso\\NotFound");

            else
                return Content(res);
        }

        public ActionResult CalificarNegativo()
        {
            return View("..\\Curso\\NotFound");
        }

        //
        // AJAX Calificar Negativo
        [Authorize]
        [HttpGet]
        public ActionResult CalificarNegativo(int id)
        {
            String res = Calificar(id, false);
            if (res == "NotFound")
                return View("..\\Curso\\NotFound");

            else
                return Content(res);
        }

        public string Calificar(int id, bool positivo)
        {
            try
            {
                // CALIFICACIONES
                Recomendacion rec = reporecom.GetRecomendacion(id);
                int sumaCalificaciones = 0;
                foreach (var c in rec.GetCalificaciones())
                    sumaCalificaciones += c.Valor;

                int cal = -1;
                if (positivo)
                    cal = 1;
                Recomendacion recomendacion = reporecom.GetRecomendacion(id);
                Seccion seccion = repocurso.GetSeccion(recomendacion.IDSeccion);

                string usuarioNombre = User.Identity.Name;

                //No se puede calificar a sus propias recomendaciones
                if (usuarioNombre == recomendacion.Usuario.Nombre)
                    return "ERROR: No puedes calificar tus recomendaciones.";

                int id_usuario = repousuario.GetIdByName(usuarioNombre);


                Calificacion calificacion = recomendacion.GetCalificacionUsuario(usuarioNombre);

                if (calificacion == null)
                {
                    calificacion = new Calificacion();
                    calificacion.IDUsuario = id_usuario;
                    calificacion.IDRecomendacion = id;
                    calificacion.Valor = cal;
                    reporecom.AddCalificacion(calificacion);
                }
                else
                {
                    sumaCalificaciones -= calificacion.Valor;
                    calificacion.Valor = cal;  
                    reporecom.Save();
                }
                sumaCalificaciones += cal;

                string good = "";
                string bad = "";
                if (cal == 1)
                    good = "ON";

                else if (cal == -1)
                    bad = "ON";

                return "Calificación: " + sumaCalificaciones + "<br />" +
                                "<a href='javascript:calificar("+recomendacion.IDRecomendacion+", true)'><img src=\"../../Content/Images/Good" + good + ".png\" alt=\"Good\" /></a>" +
                                "<a href='javascript:calificar("+recomendacion.IDRecomendacion+", false)'><img src=\"../../Content/Images/Bad" + bad + ".png\" alt=\"Bad\" /></a></div>";
            }
            catch
            {
                return "NotFound";
            }
        }

        //
        // POST: /Seccion/Create
        [HttpGet]
        public ActionResult Create(int ids, int valor, bool anonimo, string contenido, bool first)
        {
                if(User == null)
                    return View("..\\Curso\\NotFound");

                int id_usuario = repousuario.GetIdByName(User.Identity.Name);

                Seccion seccion = repocurso.GetSeccion(ids);

                Recomendacion recomendacion = new Recomendacion();
                recomendacion.IDUsuario = id_usuario;
                recomendacion.Contenido = contenido;
                recomendacion.IDSeccion = ids;
                recomendacion.Valor = valor;
                recomendacion.EsAnonimo = anonimo;
                recomendacion.Fecha = DateTime.Now;
                recomendacion.Activo = true;

                ViewData["first"] = first;

                //si el contenido de la recomendacion va vacio, se recarga la pagina sin cambios, de lo contrario sigue normalmente
                if (String.IsNullOrWhiteSpace(recomendacion.Contenido))
                {
                    return Content("ERROR:No puedes dejar el campo de contenido vacío");
                }
                else
                {
                    reporecom.AddRecomendacion(recomendacion);
                    return View("Recomendacion", recomendacion);
                }           
        }


        //
        // GET: /Seccion/Edit/5
        [Authorize]
        public ActionResult Reportar(int id)
        {
            Recomendacion recomendacion = repocurso.GetRecomendacion(id);

            if (recomendacion == null)
                return View("..\\Curso\\NotFound");
            else
            {
                // por si alguien ingresa el url para reportar una recomendacion, sin estar loggeado
                if (Request.IsAuthenticated)
                {
                    int id_usuario = repousuario.GetIdByName(this.User.Identity.Name);

                    Seccion seccion = repocurso.GetSeccion(recomendacion.IDSeccion);
                    Reporte reporte = new Reporte();
                    reporte.IDRecomendacion = id;
                    reporte.IDUsuario = id_usuario;
                    reporte.Fecha = DateTime.Now;
                    reporte.Revisado = 0;
                    reporecom.GuardaReporte(reporte);

                    return RedirectToAction("Details", new { sigla_sec = seccion.Sigla + "/" + seccion.NumSeccion });
                }
                else
                    return View("..\\Curso\\NotFound");

            }
        }


        //
        // GET: /Seccion/Delete/5

        public ActionResult Delete(int id)
        {
            Recomendacion recomendacion = repocurso.GetRecomendacion(id);

            if (recomendacion == null)
                return Content("..\\Curso\\NotFound");
            else
            {
                Seccion seccion = repocurso.GetSeccion(recomendacion.IDSeccion);
                recomendacion.Activo = false;
                repocurso.Save();

                return Content("SUCCESS");
            }
        }


        //
        // POST: /Seccion/Suscribe

        [Authorize]
        [HttpGet]
        public ActionResult Suscribe(int idSeccion, bool inscribirse, String returnUrl)
        {
            string userName = User.Identity.Name;
            Seccion seccion = repocurso.GetSeccion(idSeccion);

            if (seccion != null)
            {
                if (inscribirse)
                {
                    repousuario.AddInscripcion(userName, idSeccion);
                }
                else
                {
                    repousuario.DeleteInscripcion(userName, idSeccion);
                }

                if (returnUrl != null)
                    return Redirect(returnUrl);
                else
                    return RedirectToAction("Details", new { sigla_sec = seccion.Sigla + "/" + seccion.NumSeccion });
            }

            else
                return View("..\\Curso\\NotFound");
        }

    }
}

